package com.xbai.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * RDD缓存
  * RDD 通过 persist 方法或 cache 方法可以将前面的计算结果缓存，默认情况下 persist() 会把数据以序列化的形式缓存在 JVM 的堆空间中。
  * 但是并不是这两个方法被调用时立即缓存，而是触发后面的 action 时，该 RDD 将会被缓存在计算节点的内存中，并供后面重用。
  * cache 最终也是调用了 persist 方法，默认的存储级别都是仅在内存存储一份，Spark 的存储级别还有好多种，存储级别在 object StorageLevel 中定义的。
  * @author xbai
  * @Date 2021/1/2
  */
object Spark_Cache {

  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("cache")
    val sc = new SparkContext(conf)

    val rdd: RDD[String] = sc.makeRDD(Array("xbai"))
    val noCache = rdd.map(_.toString + System.currentTimeMillis())

    println("========= noCache =========")
    println(noCache.collect().mkString(","))
    println(noCache.collect().mkString(","))

    val cache: RDD[String] = noCache.cache()
    println("========= cache =========")
    println(cache.collect().mkString(","))
    println(cache.collect().mkString(","))

    sc.stop()
  }
}
